package com.bulletelc.apollopre.api;

import com.bulletelc.apollopre.utils.LogUtil;
import com.bulletelc.apollopre.utils.exception.ExceptionUtil;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.exception.HttpException;
import com.lzy.okgo.exception.StorageException;
import com.lzy.okgo.request.base.Request;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import okhttp3.Response;

/**
 * author: lhl
 * date  : 2017/11/10
 * desc  : 将返回的json数据解析成需要的bean对象,可以是baseBean,String,List,Map
 */

public abstract class JsonCallback<T> extends AbsCallback<T> {

    private Type type;
    private Class<T> clazz;

    public JsonCallback() {
    }

    public JsonCallback(Type type) {
        this.type = type;
    }

    public JsonCallback(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public void onStart(Request<T, ? extends Request> request) {
        super.onStart(request);
        // 主要用于在所有请求之前添加公共的请求头或请求参数
        // 例如登录授权的 token
        // 使用的设备信息
        // 可以随意添加,也可以什么都不传
        // 还可以在这里对所有的参数进行加密，均在这里实现

        //eg:
        //request.headers("header1", "HeaderValue1");
    }

    @Override
    public T convertResponse(Response response) throws Throwable {
        if (type == null) {
            if (clazz == null) {
                Type genType = getClass().getGenericSuperclass();
                type = ((ParameterizedType) genType).getActualTypeArguments()[0];
            } else {
                JsonConvert<T> convert = new JsonConvert<>(clazz);
                return convert.convertResponse(response);
            }
        }

        JsonConvert<T> convert = new JsonConvert<>(type);
        return convert.convertResponse(response);
    }

    @Override
    public void onError(com.lzy.okgo.model.Response<T> response) {
        Throwable exception = response.getException();
        if (exception!=null) {
            LogUtil.e("网络请求错误回调信息如下:");
            ExceptionUtil.handleException(exception);
        }

        if (exception instanceof UnknownHostException || exception instanceof ConnectException)  {
            LogUtil.e("网络连接错误,请连接网络!");
        } else if (exception instanceof SocketTimeoutException) {
            LogUtil.e("网络超时连接");
        } else if (exception instanceof HttpException) {
            LogUtil.e("服务端响应码404和500了");
        } else if (exception instanceof StorageException) {
            LogUtil.e("sd卡不存在或没有权限");
        } else {
            LogUtil.e("其他错误");
        }
    }
}
